package com.summer.handler;

import com.summer.service.UserServiceImpl;
import com.sunmmer.service.RpcRequest;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.springframework.cglib.reflect.FastClass;
import org.springframework.cglib.reflect.FastMethod;

public class UserServiceHandler extends ChannelInboundHandlerAdapter {

    //客户端读取数据时，该方法会被调用
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //注意：客户端将来发送请求到时候会传递一个参数
        //1、判断当前的轻轻是否符合规则
//        if(msg.toString().startsWith("UserService")){
//            //2、如果符合规则，调用实现类得到一个结果
//            UserServiceImpl service = new UserServiceImpl();
//            String result = service.sayHello(msg.toString().substring(msg.toString().lastIndexOf("#") + 1));
//            //3、把调用实现类到方法获得到结果写到客户端
//            ctx.writeAndFlush(result);
//        }

        //校验发送过来的数据是否是RpcRequest对象
        if(msg instanceof RpcRequest){
            RpcRequest rpcRequest = (RpcRequest)msg;
            //使用Class.forName进行加载Class文件
            System.out.println(rpcRequest.getClassName());
            Class<?> clazz = Class.forName("com.summer.service.UserServiceImpl");
            Object serviceBean = clazz.newInstance();
            Class<?> serviceClass = serviceBean.getClass();
            String methodName = rpcRequest.getMethodName();

            Class<?>[] parameterTypes = rpcRequest.getParameterTypes();
            Object[] parameters = rpcRequest.getParameters();
            System.out.println("客户端传递过来参数是:"+parameters[0]);

            //使用CGLIB动态代理
            FastClass fastClass = FastClass.create(serviceClass);
            FastMethod fastMethod = fastClass.getMethod(methodName, parameterTypes);
            //开始调用CGLIB动态代理执行服务端方法
            Object result = fastMethod.invoke(serviceBean, parameters);
            //将执行结果写回客户端
            ctx.writeAndFlush(result.toString());
        }

    }
}
